#ifndef DFG_H
#define DFG_H

#include <stdbool.h>
#include "symbol.h"
#include "list.h"
#include "const_prpgt.h"

typedef struct dfg{
	struct list_head bbs_head;  // 流图的所有基本块
	
}dfg_t;



typedef struct basic_block{
    // 基本块加入 dfg 的链表, 构成流图所有的基本块
	struct list_head entry_in_dfg; 
    // 基本块的指令序列
	struct list_head insts_head; 
    // 基本块的前驱 predecessor
	struct list_head prede_head;
    // 基本块的后继   successor
	struct list_head suc_head; 
	bool visited; // 访问标记
	bool reach;   // 块可达标记,不可达块不作为数据流处理对象
	int id; // 编号
	 // 常量传播的输入集合和输出集合
	const_prpgt_in_bb_t const_prpgt;
}bb_t;

dfg_t *new_dfg(void);
void optimize_funs(void);
void destroy_bbs(struct list_head *head);
void print_dfg(fun_t *fun);
void create_dfg(fun_t *fun);
void kill_link(bb_t *prede, bb_t *suc, struct list_head *head);
int remove_unreachable_block(struct list_head *head);
int extract_reachable_code(struct list_head *bbs_head, struct list_head *code_out);
void print_dfg_dot(fun_t *fun);
#endif